package com.yanhua.transaction.aspect;

import com.yanhua.transaction.annotation.YhTransactional;
import com.yanhua.transaction.common.util.TransactionConst;
import com.yanhua.transaction.transactional.YhTransaction;
import com.yanhua.transaction.transactional.YhTransactionManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Objects;

@Aspect
@Component
@Order(10000)
public class YhTransactionAspect {


    @Around("@annotation(com.yanhua.transaction.annotation.YhTransactional)")
    public void invoke(ProceedingJoinPoint point) {
        // 打印出这个注解所对应的方法
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        YhTransactional yhTransactional = method.getAnnotation(YhTransactional.class);

        String groupId;
        if (Objects.equals(yhTransactional.value(), TransactionConst.TransactionState.start)) {
            groupId = YhTransactionManager.createYhTransactionGroup();
        } else {
            groupId = YhTransactionManager.getCurrentGroupId();
        }
        YhTransaction yhTransaction = YhTransactionManager.createYhTransaction(groupId);

        try {
            point.proceed();
            YhTransactionManager.addYhTransaction(yhTransaction, yhTransactional.value(), TransactionConst.TransactionType.commit);
        } catch (Throwable e) {
            //异常
            YhTransactionManager.addYhTransaction(yhTransaction, TransactionConst.TransactionState.end, TransactionConst.TransactionType.rollback);
            e.printStackTrace();
        }
    }
}
